// const log4js = require('log4js');
// const path = require('path');
import * as log4js from 'log4js';
import * as path from 'path';

function createAppenders(type) {
  return {
    type: 'dateFile', // file 保存到文件，dateFile 文件自动以当前日期作为后缀
    // filename: path.resolve(__dirname, './logs', type, 'logging.log'),
    filename: path.join('logs4js', type, 'logging.log'),
    maxLogSize: 1024 * 1024, //配置文件的最大字节数,到达自动分类文件
    keepFileExt: true,
    // daysToKeep: 3, // 保留天数
    numBackups: 5, // 指定保留的旧日志文件数量。超过这个数量的旧日志文件会被自动删除。
    layout: {
      // 自定义日志中时间的格式
      type: 'pattern',
      pattern: '%c [%d{yyyy-MM-dd hh:mm:ss}] [%p]: %m%n',
    },
  };
}
log4js.configure({
  // 定义出口
  appenders: {
    // 定义一个sql日志出口
    sql: createAppenders('sql'),
    // api_erorr 日志出口
    api_erorr: createAppenders('api_erorr'),
    // 所有接口请求日志出口
    http: createAppenders('http'),
    // 定义一个默认输出
    // default: {
    //   type: 'stdout', // 控制台输出
    // },
    default: createAppenders('default'),
  },
  // 配置分类
  categories: {
    sql: {
      appenders: ['sql'], //该分类使用出口sql的配置写入日志
      level: 'all',
    },
    api_erorr: {
      appenders: ['api_erorr'], //该分类使用出口api的配置写入日志
      level: 'all',
    },
    http: {
      appenders: ['http'], //该分类使用出口http的配置写入日志
      level: 'all',
    },
    // 定义一个默认分类
    default: {
      appenders: ['default'],
      level: 'all',
    },
  },
});

// 程序关闭或意外关闭时结束日志，并把该保存的日志进行最后的保存
process.on('exit', () => {
  log4js.shutdown();
});

export const defaultLogger = log4js.getLogger();
export const sqlLogger = log4js.getLogger('sql');
export const apiLogger = log4js.getLogger('api_erorr');
export const httpLogger = log4js.getLogger('http');
export const connectLogger = log4js.connectLogger(httpLogger, {
  nolog: '\\.gif|\\.jpg|\\.png|\\.css|\\.js', // 不记录这些请求
  level: 'auto', // 自动根据响应状态选择日志级别
  statusRules: [
    { from: 200, to: 299, level: 'info' },
    { codes: [303, 304], level: 'warn' },
    { from: 400, to: 499, level: 'error' },
    { from: 500, to: 599, level: 'fatal' },
  ],
  format:
    ':remote-addr :method :url HTTP/:http-version :status :content-length :response-time ms',
});

// exports.sqlLogger = sqlLogger;
// exports.logger = defaultLogger;
// exports.apiLogger = apiLogger;

// format：你可以使用以下标记来自定义日志格式
// :remote-addr - 远程地址
// :remote-user - 远程用户
// :date - 请求日期
// :method - HTTP 方法
// :url - 请求 URL
// :http-version - HTTP 版本
// :status - 响应状态码
// :content-length - 响应内容长度
// :response-time - 响应时间(毫秒)
// :referrer - Referrer
// :user-agent - 用户代理
